home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
libs
/
script.lzh
/
script_0.4
/
script_library.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-12-20
|
6KB
|
241 lines
/*
script_library.c
bf 11-28-96
*/
/// Includes
#include <string.h>
#include <exec/memory.h>
#include <rexx/rxslib.h>
#include <rexx/storage.h>
#include <proto/rexxsyslib.h>
#include <proto/exec.h>
#if defined (__GNUC__)
#include <stabs.h>
#endif
#include "script_library.h"
#include "variables.h"
///
/// Declarations
struct ScriptContext *AllocContext (void);
void FreeContext (struct ScriptContext *sc);
struct ExecBase *SysBase;
struct Library *ScriptBase;
#if defined (__GNUC__)
const BYTE LibName[] = "script.library";
const BYTE LibIdString[] = "$VER: script.library 0.4 (12-20-96)";
const UWORD LibVersion = 0;
const UWORD LibRevision = 4;
#endif
#if defined (__GNUC__)
#define LIBRT
#define REG(regname)
#define STRUCT_MYLIB struct Library
#elif defined (__SASC)
#define LIBRT __saveds __asm
#define REG(regname) register __ ## regname
#define ADDTABL_1(name,arg1);
#define ADDTABL_2(name,arg1,arg2);
#define ADDTABL_3(name,arg1,arg2,arg3);
#define ADDTABL_END();
#define STRUCT_MYLIB struct MyLibrary
#endif
///
/// Library (De)Initialization
int LIBRT
__UserLibInit (REG(a6) STRUCT_MYLIB *libbase)
{
SysBase = *(struct ExecBase **)4;
ScriptBase = (struct Library *) libbase;
return 0; /* success */
}
void LIBRT
__UserLibCleanup (REG(a6) STRUCT_MYLIB *libbase)
{
}
///
ADDTABL_3(LIBScript_SetRexxVar,a0,a1,a2);
/// Script_SetRexxVar()
/*
Script_SetRexxVar() is compatible with SetRexxVar():
RESULTS
error 0 for success, otherwise an error code.
(Other codes may exist, these are documented)
3 = Insufficient Storage
9 = String too long
10 = Invalid message
NOTE
The rm_avail field of a RexxMsg bust be zeroed or point to
a ScriptContext structure allocated by Script_AllocContext().
*/
LONG LIBRT
LIBScript_SetRexxVar (REG(a0) struct RexxMsg *msg, REG(a1) char *name, REG(a2) char *value)
{
struct ScriptContext *sc;
LONG err;
if (CheckRexxMsg (msg))
{
// Without this CheckRexxMsg() SetRexxVar() causes Enforcer Hits at this point!
// This is weird since the docs say SetRexxVar() does a CheckRexxMsg() on msg.
//
if ((err = SetRexxVar ((struct Message *) msg, name, value, strlen (value))) != 10)
return err;
}
if (sc = (struct ScriptContext *) msg -> rm_avail)
{
if (SetStringVariable (sc, name, value))
return 0;
return 3;
}
return 10;
}
///
ADDTABL_3(LIBScript_GetRexxVar,a0,a1,a2);
/// Script_GetRexxVar()
/*
Script_GetRexxVar() is compatible with GetRexxVar():
RESULTS
error 0 for success, otherwise an error code.
(Other codes may exist, these are documented)
3 = Insufficient Storage
9 = String too long
10 = Invalid message
NOTE
The rm_avail field of a RexxMsg bust be zeroed or point to
a ScriptContext structure allocated by Script_AllocContext().
*/
LONG LIBRT
LIBScript_GetRexxVar (REG(a0) struct RexxMsg *msg, REG(a1) char *name, REG(a2) char **value)
{
struct ScriptContext *sc;
LONG err;
*value = NULL;
if ((err = GetRexxVar ((struct Message *) msg, name, (UBYTE **) value)) != 10)
return err;
if (sc = (struct ScriptContext *) msg -> rm_avail)
{
*value = GetStringVariable (sc, name);
return 0;
}
return 10;
}
///
ADDTABL_1(LIBScript_AllocContext,a0);
/// Script_AllocContext()
struct ScriptContext * LIBRT
LIBScript_AllocContext (void)
{
return AllocContext ();
}
struct ScriptContext *
AllocContext (void)
{
struct ScriptContext *sc = NULL;
void *pool = NULL;
if (!(pool = CreatePool (MEMF_PUBLIC, 1024, 1024)))
return NULL;
if (!(sc = AllocPooled (pool, sizeof (struct ScriptContext))))
{
DeletePool (pool);
return NULL;
}
NewList ((struct List *) &sc -> sc_Vars);
sc -> sc_MemPool = pool;
return sc;
}
///
ADDTABL_1(LIBScript_FreeContext,a0);
/// Script_FreeContext()
void LIBRT
LIBScript_FreeContext (REG(a0) struct ScriptContext *sc)
{
FreeContext (sc);
}
void
FreeContext (struct ScriptContext *sc)
{
DeletePool (sc -> sc_MemPool);
}
///
ADDTABL_2(LIBScript_SetMsgContext,a0,a1);
/// Script_SetMsgContext()
/*
It may appear silly to have an extra function just to make this assignment but
rm_avail is not officially reserved to contain "struct ScriptContext *" and
future versions of script.library may have to use a different method.
Maybe "msg -> rm_Node.mn_Node.ln_Name" or "msg -> rm_ScriptContext" :)
Please use Script_SetMsgContext() and don't access rm_avail directly!
*/
void LIBRT
LIBScript_SetMsgContext (REG(a0) struct RexxMsg *msg, REG(a1) struct ScriptContext *sc)
{
msg -> rm_avail = (long) sc;
}
///
ADDTABL_1(LIBScript_GetMsgContext,a0);
/// Script_GetMsgContext()
struct ScriptContext * LIBRT
LIBScript_GetMsgContext (REG(a0) struct RexxMsg *msg)
{
return (struct ScriptContext *) msg -> rm_avail;
}
///
ADDTABL_3(LIBScript_SetStringVar,a0,a1,a2);
/// Script_SetStringVar()
LONG LIBRT
LIBScript_SetStringVar (REG(a0) struct ScriptContext *sc, REG(a1) char *name, REG(a2) char *value)
{
if (SetStringVariable (sc, name, value))
return 0;
return 3;
}
///
ADDTABL_3(LIBScript_GetStringVar,a0,a1,a2);
/// Script_GetStringVar()
LONG LIBRT
LIBScript_GetStringVar (REG(a0) struct ScriptContext *sc, REG(a1) char *name, REG(a2) char **value)
{
*value = GetStringVariable (sc, name);
return 0;
}
///
ADDTABL_END();